package _7_集合._5_Stack;

import org.junit.jupiter.api.Test;

import java.util.Stack;

public class StackTest {
    @Test
    public void jisuan(){
//        Stack<String> stack = new Stack<>();
//        stack.push("200");
//        stack.push("+");
//        stack.push("500.00");
//        stack.push("\\");
//        stack.push("365");
//        System.out.println(ReaderTest);


        int startIndex = 0;
        int endIndex = 0;
        Stack<String> stack = new Stack<>();
        String temp = "";
        boolean isJiSuan = false;
        String fuHao = "";
        String jisuanshi = "32/50%";
//        jisuanshi = "25350.28*27.3973%*92.0/100.0*0.6375";
//        jisuanshi = "25350.28*32.8767%*112.0/120.0*0.6375-25350.28*27.3973%*92.0/100.0*0.6375";
        jisuanshi = "3802.54*100.0000/100*365/365*ReaderTest.3225-3802.54*100.0000/100*0/365*ReaderTest.3225-5028.86*3%";
        char[] jisuanshiArray = jisuanshi.toCharArray();

        //遍历表达式，将数字 与 "+"、"-"运算符并放入堆栈中
        for (int i = 0; i < jisuanshiArray.length; i++){

            //如果遇到运算符 或 最后一位
            if(
                    '*' == jisuanshiArray[i]
                            || '/' == jisuanshiArray[i]
                            || '+' == jisuanshiArray[i]
                            || '-' == jisuanshiArray[i]
                            || '%' == jisuanshiArray[i]
                            || i == jisuanshiArray.length -1
            ){
                //ReaderTest. 截取数字
                //遇到符号后，截取符号前的数字
                //如果是最后一位值，且不是百分号
                if( i == jisuanshiArray.length -1 && '%' != jisuanshiArray[i]){
                    temp = jisuanshi.substring(startIndex, endIndex + 1);
                    //temp = jisuanshi.substring(startIndex);
                }
                //“%/”连续运算符时，直接从栈中取值，不截取
                else if(startIndex == endIndex){
                    temp = stack.pop();
                }
                //ReaderTest.非最后一位
                //2.最后一位是%
                else {
                    temp = jisuanshi.substring(startIndex, endIndex);
                }

                //2. 压栈
                //是否有乘除计算，如果有则1.出栈、2.计算、3.入栈；没有则直接入栈
                if(isJiSuan){
                    String popStr = stack.pop();
                    System.out.println("stack.pop：" + popStr);
                    System.out.println("截取的字符：" + temp);
                    System.out.println("符号：" + fuHao);
                    double tempDouble = 0;

                    if("*".equals(fuHao)){
                        tempDouble = Double.parseDouble(popStr) * Double.parseDouble(temp);
                    }
                    else if("/".equals(fuHao)){
                        tempDouble = Double.parseDouble(popStr) / Double.parseDouble(temp);
                    }
                    System.out.println("压栈计算结果：" + tempDouble);
                    stack.push(tempDouble + "");
                    isJiSuan = false;
                }
                else {
                    stack.push(temp);
                }

                //3. 符号处理
                //如果是 “*” 或者 “/”，临时保存符号，并标记下次需要计算
                if('*' == jisuanshiArray[i] || '/' == jisuanshiArray[i]){
                    isJiSuan = true;
                    fuHao = jisuanshiArray[i] + "";
                }

                //如果是 “+” 或者 “-”，则符号入栈
                else if('+' == jisuanshiArray[i] || '-' == jisuanshiArray[i]){
                    stack.push(jisuanshiArray[i] + "");
                }

                //如果是"%"，则从堆栈中，取出数除以100，再放入堆栈中
                else if('%' == jisuanshiArray[i]){
                    double tempDouble = Double.parseDouble(stack.pop());
                    System.out.println("百分号，除以100：" + (tempDouble/100));
                    stack.push((tempDouble/100) + "");
                }

                //设置起始指针
                startIndex = endIndex + 1;//跳过符号位
            }

            //设置结束指针
            endIndex++;
        }
        System.out.println();




        //3.将堆栈中仅剩的“+”、“-”符号与数字依次取出计算
    }



}












